package com.zysstudy.stream;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class practiceStreem1 {

    /**
     * 1.过滤与收集：从一个 List<String>中过滤出所有长度大于 5 的字符串，并收集到新的列表。
     * <p>
     * 2.转换大小写：将一个 List<String>中的所有字符串转换为大写，并收集到新列表。
     * <p>
     * 3.对象属性提取：有一个 List<User>，其中 User有 name和 age。提取所有用户的姓名到一个新列表。
     * <p>
     * 4.去重：从一个有重复整数的 List<Integer>中去重，得到唯一值的列表。
     * <p>
     * 5.排序：对一个 List<Integer>进行降序排序。
     * <p>
     * 6.对象排序：对 List<User>按年龄升序排序。
     * <p>
     * 7.统计数量：统计一个 List<String>中长度大于 3 的字符串的个数。
     * <p>
     * 8.求和：计算一个 List<Integer>中所有整数的和。
     * <p>
     * 9.求最大：找出一个 List<Integer>中的最大值。
     * <p>
     * 10.连接字符串：将一个 List<String>中的字符串用逗号连接成一个字符串。
     */
    public static void main(String[] args) {
        practiceStreem1 p = new practiceStreem1();
        System.out.println(p.p1());
        System.out.println(p.p2());
        System.out.println(p.p3());
        System.out.println(p.p4());
        System.out.println(p.p5());
        System.out.println(p.p6());
        System.out.println(p.p7());
        System.out.println(p.p8());
    }

    //  1.过滤与收集：从一个 List<String>中过滤出所有长度大于 5 的字符串，并收集到新的列表。
    private List<String> p1() {
        List<String> list = Arrays.asList("hello", "I", "my", "you", "love", "top",
                "practice", "school", "beatful", "talk about");
        List<String> newList = list.stream().filter(s -> s.length() > 5).collect(Collectors.toList());
        return newList;
    }

    private List<String> p2() {
        List<String> list = Arrays.asList("hello", "I", "my", "you", "love", "top",
                "practice", "school", "beatful", "talk about");
        List<String> newList = list.stream().map(s -> s.toUpperCase()).collect(Collectors.toList());
        return newList;
    }

    // 3.对象属性提取：有一个 List<User>，其中 User有 name和 age。提取所有用户的姓名到一个新列表。
    private List<String> p3() {
        List<User> list = Arrays.asList(new User("zys1", 18, 1), new User("zys2", 19, 2), new User("zy3s", 20, 1));
        List<String> newList = list.stream().map(s -> s.getName()).collect(Collectors.toList());
        return newList;
    }


    //   * 4.去重：从一个有重复整数的 List<Integer>中去重，得到唯一值的列表。
    private List<Integer> p4() {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        List<Integer> newList = list.stream().distinct().collect(Collectors.toList());
        return newList;
    }

    // 5.排序：对一个 List<Integer>进行降序排序。
    private List<Integer> p5() {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        List<Integer> newList = list.stream().sorted().collect(Collectors.toList());
        return newList;
    }

    // 6.对象排序：对 List<User>按年龄升序排序。
    private List<User> p6() {
        List<User> list = Arrays.asList(new User("zys1", 18, 1), new User("zys2", 19, 2), new User("zy3s", 20, 1));
        List<User> newList = list.stream().sorted((o1, o2) -> o1.getAge().compareTo(o2.getAge())).collect(Collectors.toList());
        return newList;
    }

    // 7.统计数量：统计一个 List<String>中长度大于 3 的字符串的个数。
    private long p7() {
        List<String> list = Arrays.asList("hello", "I", "my", "you", "love", "top",
                "practice", "school", "beatful", "talk about");
        long count = list.stream().filter(s -> s.length() > 3).count();
        return count;

    }

    // 8.求和：计算一个 List<Integer>中所有整数的和。
    private int p8() {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        int sum = list.stream().mapToInt(Integer::intValue).sum();
        int sum2 = list.stream().mapToInt(i -> i).sum();
        return list.stream().collect(Collectors.summingInt(Integer::intValue));
    }

    // 9.求最大：找出一个 List<Integer>中的最大值。
    private int p9() {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        Integer max = list.stream().mapToInt(Integer::intValue).max().orElse(0);
        Integer max2 = list.stream().mapToInt(i -> i).max().orElse(0);
        Integer max3= list.stream().collect(Collectors.maxBy(Integer::compareTo)).get();
        Integer max4 = list.stream().max(Integer::compareTo).get();
        return list.stream().mapToInt(Integer::intValue).max().getAsInt();
    }

    // 10.连接字符串：将一个 List<String>中的字符串用逗号连接成一个字符串。
    private String p10() {
        List<String> list = Arrays.asList("hello", "I", "my", "you", "love", "top",
                "practice", "school", "beatful", "talk about");

        String join = list.stream().collect(Collectors.joining(","));
        return join;
    }
}
